#!/usr/bin/python
# -*- coding: utf-8 -*-

# PyGtalkRobot: A simple jabber/xmpp bot framework using Regular Expression Pattern as command controller
# Copyright (c) 2008 Demiao Lin <ldmiao@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Homepage: http://code.google.com/p/pygtalkrobot/
#

#
# This is an sample PyGtalkRobot that serves to set the show type and status text of robot by receiving message commands.
#

import sys
import time

from django.conf import settings

from PyGtalkRobot import GtalkRobot
import bitly
from mobile.models import *

############################################################################################################################

class infocarretera_gtalk_bot(GtalkRobot):
    
    #Regular Expression Pattern Tips:
    # I or IGNORECASE <=> (?i)      case insensitive matching
    # L or LOCALE <=> (?L)          make \w, \W, \b, \B dependent on the current locale
    # M or MULTILINE <=> (?m)       matches every new line and not only start/end of the whole string
    # S or DOTALL <=> (?s)          '.' matches ALL chars, including newline
    # U or UNICODE <=> (?u)         Make \w, \W, \b, and \B dependent on the Unicode character properties database.
    # X or VERBOSE <=> (?x)         Ignores whitespace outside character sets
    
    #"command_" is the command prefix, "001" is the priviledge num, "setState" is the method name.
    #Este metodo responde al saludo tipico con una breve explicacion del servicio
    def command_001_hola(self, user, message, args):
        '''(hola|hi|ey)'''
        self.replyMessage(user, u"Hola! Bienvenido a infocarretera, un servicio que facilita el acceso a la información vial del País Vasco a través de unos sencillos comandos. Si aún no sabes cuáles son, puedes solicitarlos escribiendo ayuda.")
    #Este metodo lista los comandos disponibles
    def command_002_help(self, user, message, args):
        '''(help|ayuda)'''
        respuesta = u'Los comandos que puedes utilizar son los siguientes:\n'
        respuesta += u'- a: listado de accesos\n'
        respuesta += u'- a municipio: estado de accesos a municipio\n'
        respuesta += u'- acceso: listado de accesos\n'
        respuesta += u'- acceso municipio: estado de acceso al municipio\n'
        respuesta += u'- c: listado de accesos con cámaras\n'
        respuesta += u'- c acceso: cámaras del acceso indicado\n'
        respuesta += u'- camaras : listado accesos con cámaras\n'
        respuesta += u'- camaras acceso: cámaras del acceso indicado\n'
        respuesta += u'- i: listado de carreteras\n'
        respuesta += u'- i carretera: incidencias de carretera indicada\n'
        respuesta += u'- incidencias : listado de carreteras\n'
        respuesta += u'- incidencias carretera: incidencias de carretera indicada\n'
        respuesta += u'- p: listado de puertos\n'
        respuesta += u'- p puerto: estado del puerto indicado\n'
        respuesta += u'- puerto : listado puertos\n'
        respuesta += u'- puerto puerto: estado del puerto indicado\n'
        respuesta += u'- about: información sobre infocarretera\n'
        self.replyMessage(user, respuesta)
     
    def command_003_about(self, user, message, args):
        '''(about)'''
        respuesta = u'infocarretera es un proyecto desarrollado para el http://www.abredatos.es Desafío Abredatos 2010, entre el 17 y 18 de abril, por parte de:\n'
        respuesta += u'- Asier Martínez\n- Jorge Bastida\n- Nerea Marta\n- Imanol Eizaguirre\n'
        respuesta += u'Más información en http://www.infocarretera.com'
        self.replyMessage(user, respuesta)
        
    # ACCESOS ################################################################################
    #Este comando retorna  el estado de los accesos a un municipio o la lista de accesos disponibles en caso de no indicar uno en concreto
    def command_011_accesos(self, user, message, args):
        '''(a|acceso)(\s.+)?'''
        obj_acceso = None
        acceso = None
        resp = ''
        params = message.lower().split(' ',1)
        if len(params) > 1 and params[1] != '':
            #hay ciudad
            try:
                obj_acceso = Entry.objects.get(label__iexact=params[1])
                acceso = obj_acceso.get_last_capture()
                fecha = u'%s-%s-%s %s:%s' % (acceso.created.day, acceso.created.month, acceso.created.year, acceso.created.hour, acceso.created.minute)
                resp = u'El acceso por %s es %s (%s)' % (acceso.entry.label, acceso.get_status_display(), fecha)
            except:
                pass
            #pillar las camaras del acceso
            try:
                camaras = EntryCamera.objects.filter(name__iexact=params[1])
                if camaras:
                    miniurl = bitly.Api(login=settings.BITLY_USERNAME, apikey=settings.BITLY_API_KEY)
                    resp += u'\nCámaras: '
                    for camara in camaras:
                        resp += '%s %s\n' % (miniurl.shorten(camara.url), camara.name)
                if not obj_acceso:
                    resp = u'No hay accesos registrados como %s. Puedes comprobar los accesos disponibles aquí http://www.infocarretera.com/accesos/' % params[1].capitalize()
            except:
                pass
        else:
            #lista de accesos
            resp = u'Puedes comprobar los accesos disponibles aquí http://www.infocarretera.com/accesos/'
        self.replyMessage(user, resp)
        
    # CAMARAS ################################################################################
    #Este comando retorna  el estado de los camaras de un acceso o la lista de camaras disponibles en caso de no indicar una en concreto
    def command_012_camaras(self, user, message, args):
        '''(c|camaras)(\s.+)?'''
        camaras = None
        resp = ''
        params = message.lower().split(' ',1)
        if len(params) > 1 and params[1] != '':
            #hay ciudad
            camaras = Camera.objects.filter(name__iexact=params[1])            
            resp = u'Las cámaras de %s son:\n' % (params[1].capitalize())
            for camara in camaras:
                resp += '- %s\n' % camara.url
            if not camaras:
                resp = u'No hay cámaras registradas como %s. Puedes comprobar las cámaras disponibles aquí http://www.infocarretera.com/camaras/' % params[1].capitalize()
        else:
            #lista de camaras
            resp = u'Puedes comprobar las cámaras disponibles aquí http://www.infocarretera.com/camaras/'
        self.replyMessage(user, resp)
    
    # INCIDENCIAS ################################################################################
    #Este comando retorna las incidencias de la carretera indicada, o el listado de carreteras en caso de no indicar cual
    def command_013_incidencias(self, user, message, args):
        '''(i|incidencias)(\s.+)?'''
        incs = None
        resp = ''
        params = message.lower().split(' ',1)
        if len(params) > 1 and params[1] != '':
            capture = CAPVIncidentCapture.get_last_capture()
            incs = CAPVIncident.objects.filter(carretera__name__iexact=params[1], capture=capture)
            resp = 'Incidencias en la %s:\n' % params[1].upper()
            for inc in incs:
                resp += '- km %s: tipo: %s causa: %s' % (inc.km, inc.tipo.name, inc.causa.name)
                if inc.sentido != '':
                    resp += ' sentido: %s\n' % inc.sentido
                if inc.retencion != '':
                    resp += ' retenciones: %s' % inc.retencion
                resp += '\n'
            if not incs:
                resp = 'No hay carreteras registradas como %s. Puedes comprobar las carreteras disponibles aquí http://www.infocarretera.com/carreteras/' % params[1].upper()
        else:
            #lista de carreteras
            resp = u'Puedes comprobar las carreteras disponibles aquí http://www.infocarretera.com/carreteras/'
        self.replyMessage(user, resp)
        
    # PUERTOS ################################################################################
    #Este comando retorna el estado del puerto indicado, o el listado de puertos en caso de no indicar cual
    def command_014_puerto(self, user, message, args):
        '''(p|puertos)(\s.+)?'''
        puertos = None
        user_puerto = None
        resp = ''
        params = message.lower().split(' ',1)
        if len(params) > 1 and params[1] != '':
            capture = CAPVPuertoCapture()
            capture = capture.get_last_capture()
            try:
                user_puerto = CAPVPuerto.objects.get(name__iexact=unicode(params[1]).upper())
                puertos = CAPVPuertoIncident.objects.filter(puerto=user_puerto, capture=capture)
            except:
                pass
            resp = 'Estado del puerto %s:\n' % unicode(params[1]).upper()
            if puertos:
                for puerto in puertos:
                    if puerto.vialidad:
                        vialidad = 'ok'
                    else:
                        vialidad = 'no'
                    resp += '-%s turismos: %s\n- articulados:%s\n- camiones: %s\n- vialidad: %s\n' % (puerto.puerto.carretera.name, puerto.get_estado_turismos_display(), puerto.get_estado_articulados_display(), puerto.get_estado_camiones_display(), vialidad)
            if not user_puerto:
                resp = 'No hay puertos registrados como %s. Puedes comprobar los puertos disponibles aquí http://www.infocarretera.com/puertos/' % params[1].capitalize()
            else:
                if not puertos:
                    #existe el puerto pero no tiene incidencias
                    resp = u'Sin incidencias en %s' % unicode(params[1])
        else:
            #lista de puertos 
            resp = u'Puedes comprobar los puertos disponibles aquí http://www.infocarretera.com/puertos/'
        self.replyMessage(user, resp)
    
    #Repuesta por defecto
    def command_100_default(self, user, message, args):
        '''.*?(?s)(?m)'''
        self.replyMessage(user, "Perdona, pero no entiendo lo que quieres decir. Para mas informacion, escribe ayuda")
